/**
 * Created by seeker910 on 2014/9/2.
 * 在需要进行内容缩放时，建议使用tansform-scale 和 transform-origin = 'top'，不建议使用：zoom（非标准属性）
 */
Rsd.define('Rsd.control.IframeBox', {
    extend: 'Rsd.control.Component',
    requires: ['Rsd.data.Ajax'],
    xtype:'iframe',
    ctrlTagName: 'iframe',
    src:'javascript:void(0);',//显示空白页，避免显示404
    method:'GET',
    
    "timeout":100,
    /**
     * 规定 <iframe> 看起来像是父文档中的一部分。
     */
    seamless:true,
    /**
     * 对 <iframe> 的内容定义一系列额外的限制。
     * allow-forms
     * allow-same-origin
     * allow-scripts
     * allow-top-navigation
     */
    sandbox:'allow-forms allow-same-origin allow-scripts allow-top-navigation',
    /**
     * 不执行文档中的js
     */
    usingSrc:false,
    /**
     * 使用页面间通讯
     */
    usingMessage:false,
    /**
     * iframe onload 事件
     */
    onload:null,
    static:function()
    { 
        //注册对象是window，所以仅注册一次
        //接收来自子页面(iframe)的消息
        window.addEventListener('message', function (evt) { 
            //console.log('window message',evt);
            Rsd.app.fire('message_'+evt.origin, [evt]);
        });
    },
    /**
     * 
     * @param {*} config 
     */
    constructor: function IframeBox(config) {
        config = config || {};
        this.apply(config);
    },
    /*
    * */
    onAfterInit:function onAfterInit()
    {
        var me = this;
        this.callParent();
        // 
        if(me.sandbox)
        {
            me.ctrl.element.setAttribute('sandbox', me.sandbox);
            me.ctrl.element.setAttribute('src', ''); //必须设置src为空 否则不会生效。 
        }
        if(me.seamless)
        {
            me.ctrl.element.setAttribute('seamless',me.seamless);
        }
        me.setSrc(me.src);
    },
    /*
    * */
    setSrc:function setSrc(src){

        this.src = src;
        if (!this.src) {
            return;
        }
        var me = this;
        if(me.usingMessage)
        {
            //注册为一次性 事件，否则需要在handleMessage 中手动注销事件
            var _name = 'message_'+ new URL(src).origin;
            var _once = true;
            Rsd.app.on(_name,function(evt){
                me.funApplyByIOC(me.handleMessage,[evt.data,evt.origin]); 
            },_once); 
            //console.log('为控件注册一次性事件(执行后自动销毁):' + _name);
        }
        
        if(me.usingSrc)
        {
             me.ctrl.element.src = me.src;
             return;
        }

        // 在加载失败时，延时重复加载 
        var _count = 0;
        var ajax = new Rsd.data.Ajax({ url: me.src, method: me.method, dataType: 'text' });
        var _fn = function () {
            _count++;
            var _key = setTimeout(function () {
                _fn();
            }, 200 * _count);

            if (!me.ctrl.element.contentDocument) {
                //直接返回，等待下一个延时后处理
                return;
            }

            ajax.request({}, function (resp) {

                try {
                    //判断是否支持srcdoc
                    if (me.ctrl.element.srcdoc == undefined) {
                        //该方案，html中的js不执行,不触发事件
                        me.ctrl.element.contentDocument.body.innerHTML = resp;
                    }
                    else {
                        //该方案，html中的js执行,触发事件
                        me.ctrl.element.srcdoc = resp;
                        me.ctrl.element.src = me.src;
                    }
                    
                }
                catch (err) {
                    console.log(err);
                }
                //清楚延时
                clearTimeout(_key);

                if (me.onload) {
                    me.funApplyByIOC(me.onload, [{ target: me.ctrl.element }]);
                }
            });
        }

        _fn();
    },
    /**
     * @description 向 该控件的iframe（子页面）发送消息
     * @param {*} message 
     */
    postMessage:function postMessage(message)
    { 
        var iframe = me.ctrl.element; 
        iframe.contentWindow.postMessage(message); 
    },
    /**
     * @description 处理来自该控件的iframe（子页面）的消息
     * @param {*} message 
     */
    handleMessage:function handleMessage(message)
    {
        //手动注销事件
        var _name = 'message_'+ new URL(this.src).origin;
        Rsd.app.off(_name);

        console.log('Received message from iframe:', message);
    }

});